'use strict'

/**
 * <--    还原前    -->
function i(){
    var i = 123;
    i += 2;
  return 123;
}

let x = 'p';
let y = x+'q';
 * 
 * <--    特点    -->
 * 定义的函数，没有被使用过，类似没有被使用过的变量定义一样，直接移除，便于阅读
 * 
 * <--    解决办法    -->
 * 移除僵尸函数，注意，虽然从FunctionDeclaration进入，但是需要从上级路径来获取getBinding，因为，从FunctionDeclaration进入的path.scope是函数内部作用域
 * 
 * <--    冗余判断    -->
 * 僵尸函数
 * 
 * <--    还原后    -->
let x = 'p';
let y = x + 'q';
 * 
 **/

const {parse} = require('@babel/parser');
const traverse = require('@babel/traverse').default;
const t = require('@babel/types');
const generator = require('@babel/generator').default;

let xcode = `function i(){
    var i = 123;
    i += 2;
  return 123;
}

let x = 'p';
let y = x+'q';`;

const visitor = {
    FunctionDeclaration:{
        enter:function(path){
            let binding = path.parentPath.scope.getBinding(path.get('id').node.name);
            if(!binding){return}
            if(binding.referenced && !binding.constant){return}
            path.remove();
        },
    },
}

let ast = parse(xcode);
traverse(ast, visitor);
let {code} = generator(ast);
console.log(code);
